#ifndef JSONCPP_HANDLER_H
#define JSONCPP_HANDLER_H

#include <json/json.h>

#include <type_traits>
#include <memory>
#include <string>

class JsoncppHandler
{
public:
    template<typename T, typename KeyT>
	static T JsonGet(const Json::Value &JsonValue, KeyT key, bool* hasError = 0)
    {
        return JsonGet<T>(JsonValue[key], hasError);
    }


private:
    template<typename T>
	static auto JsonGet(const Json::Value &JsonValue, bool* hasError = 0)->
    typename std::enable_if<std::is_same<int, T>::value, T>::type
	{
        return JsonValue.asInt();
    }

    template<typename T>
	static auto JsonGet(const Json::Value &JsonValue, bool* hasError = 0)->
    typename std::enable_if<std::is_same<std::string, T>::value, T>::type
	{
        return JsonValue.asString();
    }
    
    template<typename T>
	static auto JsonGet(const Json::Value &JsonValue, bool* hasError = 0)->
    typename std::enable_if<std::is_same<float, T>::value, T>::type
	{
        return JsonValue.asFloat();
    }

    template<typename T>
	static auto JsonGet(const Json::Value &JsonValue, bool* hasError = 0)->
    typename std::enable_if<std::is_same<double, T>::value, T>::type
	{
        return JsonValue.asDouble();
    }
    
    template<typename T>
	static auto JsonGet(Json::Value &JsonValue,  bool* hasError = 0)->
    typename std::enable_if<std::is_same<bool, T>::value, T>::type
	{
        return JsonValue.asBool();
    }
};

#endif